package com.shen.future;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.TimeUnit;


/**
 * 这里的异步调用可以和ajax类比
 * ajax有一个成功后回调方法success()
 * 和一个失败回调方法error()
 * 这里的completableFuture也有类似的方法
 */
public class Demo02 {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        /**
         * 有返回值的异步回调 返回值是一个Integer类型
         */
        /**
         *  public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier)
         *  Supplier 是一个供给型接口 没有参数只有返回值
         */
        CompletableFuture<Integer> completableFuture=CompletableFuture.supplyAsync(()->{
            int i=10/0;
            System.out.println(Thread.currentThread().getName()+"supplyAsync==>Integer");
            return 1;
        });

        /**
         *   BiConsumer  是一个消费型接口，只有参数传递没有返回值
         */
        System.out.println(
                completableFuture.whenComplete((t, u) -> { //成功后回调的方法
                        System.out.println("t===>" + t);
                        System.out.println("u===>" + u);
                }).exceptionally((e) -> {  //失败后回调的方法
                        System.out.println(e.getMessage());
                        return 0;
        }).get());

        /**
         * 没有任何错误输出
         * ForkJoinPool.commonPool-worker-1supplyAsync==>Integer
         * t===>1      t是方法执行后的返回值
         * u===>null
         * 1           输出的返回值
         *
         *
         * 有错误输出
         * t===>null  //因为异步方法没有执行成功
         * u===>java.util.concurrent.CompletionException: java.lang.ArithmeticException: / by zero  u输出的是错误类型
         * java.lang.ArithmeticException: / by zero  这里没有执行执行成功后的方法，走的是出错后执行的方法
         * 0    //输出报错的返回值
         *
         * 这里成功后的返回值和报错后的返回值可以按照200和404和500来输出
         *
         * java的异步调用和ajax的思想相同
         *
         */
    }
}
